package com.atguigu.spzx.manager.listener;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.atguigu.spzx.manager.mapper.CategoryMapper;
import com.atguigu.spzx.model.dto.product.CategoryExcelDto;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/*
    只有被容器创建的对象 @Autowired和@Resource才可以从容器中装配对象
 */
//@Component
public class CategoryExcelDtoListener2 extends AnalysisEventListener<CategoryExcelDto> {
//    @Resource
    CategoryMapper categoryMapper;
    public CategoryExcelDtoListener2(CategoryMapper categoryMapper){
        this.categoryMapper = categoryMapper;
    }
    //缓存数据的数组
    private List<CategoryExcelDto> list = new ArrayList<>();
    private int limit = 200;//批量保存的阈值
    @Override
    public void invoke(CategoryExcelDto categoryExcelDto, AnalysisContext analysisContext) {
        //1、判断新增的分类是否已存在：如果已存在继续读取下一条分类数据
        //防止重复提交的分类数据：判断要添加的数据是否已存在
        //  主键id不能重复、   parentId下的分类名称不能重复
        Boolean isExist = categoryMapper.isExist(categoryExcelDto);
        if(isExist){
            return;
        }
        //2、如果新增分类不存在：添加到缓存的集合中
        list.add(categoryExcelDto);
        //3、当缓存集合的数据量到200条时，批量保存
        if(list.size()>=limit){
            //达到阈值，批量保存
            categoryMapper.batchSave(list);
            //清除list的缓存
            list.clear();
        }

    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        if(list.size()>0){
            //list中还有未保存的数据
            categoryMapper.batchSave(list);
            list.clear();
        }
    }
}
